home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / msdos / input.c < prev    next >
C/C++ Source or Header  |  2000-04-25  |  20KB  |  660 lines

  1. #include "mamalleg.h"
  2. #include "driver.h"
  3.  
  4.  
  5. int use_mouse;
  6. int joystick;
  7. int use_hotrod;
  8.  
  9.  
  10.  
  11. static struct KeyboardInfo keylist[] =
  12. {
  13.     { "A",            KEY_A,                KEYCODE_A },
  14.     { "B",            KEY_B,                KEYCODE_B },
  15.     { "C",            KEY_C,                KEYCODE_C },
  16.     { "D",            KEY_D,                KEYCODE_D },
  17.     { "E",            KEY_E,                KEYCODE_E },
  18.     { "F",            KEY_F,                KEYCODE_F },
  19.     { "G",            KEY_G,                KEYCODE_G },
  20.     { "H",            KEY_H,                KEYCODE_H },
  21.     { "I",            KEY_I,                KEYCODE_I },
  22.     { "J",            KEY_J,                KEYCODE_J },
  23.     { "K",            KEY_K,                KEYCODE_K },
  24.     { "L",            KEY_L,                KEYCODE_L },
  25.     { "M",            KEY_M,                KEYCODE_M },
  26.     { "N",            KEY_N,                KEYCODE_N },
  27.     { "O",            KEY_O,                KEYCODE_O },
  28.     { "P",            KEY_P,                KEYCODE_P },
  29.     { "Q",            KEY_Q,                KEYCODE_Q },
  30.     { "R",            KEY_R,                KEYCODE_R },
  31.     { "S",            KEY_S,                KEYCODE_S },
  32.     { "T",            KEY_T,                KEYCODE_T },
  33.     { "U",            KEY_U,                KEYCODE_U },
  34.     { "V",            KEY_V,                KEYCODE_V },
  35.     { "W",            KEY_W,                KEYCODE_W },
  36.     { "X",            KEY_X,                KEYCODE_X },
  37.     { "Y",            KEY_Y,                KEYCODE_Y },
  38.     { "Z",            KEY_Z,                KEYCODE_Z },
  39.     { "0",            KEY_0,                KEYCODE_0 },
  40.     { "1",            KEY_1,                KEYCODE_1 },
  41.     { "2",            KEY_2,                KEYCODE_2 },
  42.     { "3",            KEY_3,                KEYCODE_3 },
  43.     { "4",            KEY_4,                KEYCODE_4 },
  44.     { "5",            KEY_5,                KEYCODE_5 },
  45.     { "6",            KEY_6,                KEYCODE_6 },
  46.     { "7",            KEY_7,                KEYCODE_7 },
  47.     { "8",            KEY_8,                KEYCODE_8 },
  48.     { "9",            KEY_9,                KEYCODE_9 },
  49.     { "0 PAD",        KEY_0_PAD,            KEYCODE_0_PAD },
  50.     { "1 PAD",        KEY_1_PAD,            KEYCODE_1_PAD },
  51.     { "2 PAD",        KEY_2_PAD,            KEYCODE_2_PAD },
  52.     { "3 PAD",        KEY_3_PAD,            KEYCODE_3_PAD },
  53.     { "4 PAD",        KEY_4_PAD,            KEYCODE_4_PAD },
  54.     { "5 PAD",        KEY_5_PAD,            KEYCODE_5_PAD },
  55.     { "6 PAD",        KEY_6_PAD,            KEYCODE_6_PAD },
  56.     { "7 PAD",        KEY_7_PAD,            KEYCODE_7_PAD },
  57.     { "8 PAD",        KEY_8_PAD,            KEYCODE_8_PAD },
  58.     { "9 PAD",        KEY_9_PAD,            KEYCODE_9_PAD },
  59.     { "F1",            KEY_F1,                KEYCODE_F1 },
  60.     { "F2",            KEY_F2,                KEYCODE_F2 },
  61.     { "F3",            KEY_F3,                KEYCODE_F3 },
  62.     { "F4",            KEY_F4,                KEYCODE_F4 },
  63.     { "F5",            KEY_F5,                KEYCODE_F5 },
  64.     { "F6",            KEY_F6,                KEYCODE_F6 },
  65.     { "F7",            KEY_F7,                KEYCODE_F7 },
  66.     { "F8",            KEY_F8,                KEYCODE_F8 },
  67.     { "F9",            KEY_F9,                KEYCODE_F9 },
  68.     { "F10",        KEY_F10,            KEYCODE_F10 },
  69.     { "F11",        KEY_F11,            KEYCODE_F11 },
  70.     { "F12",        KEY_F12,            KEYCODE_F12 },
  71.     { "ESC",        KEY_ESC,            KEYCODE_ESC },
  72.     { "~",            KEY_TILDE,            KEYCODE_TILDE },
  73.     { "-",          KEY_MINUS,          KEYCODE_MINUS },
  74.     { "=",          KEY_EQUALS,         KEYCODE_EQUALS },
  75.     { "BKSPACE",    KEY_BACKSPACE,        KEYCODE_BACKSPACE },
  76.     { "TAB",        KEY_TAB,            KEYCODE_TAB },
  77.     { "[",          KEY_OPENBRACE,      KEYCODE_OPENBRACE },
  78.     { "]",          KEY_CLOSEBRACE,     KEYCODE_CLOSEBRACE },
  79.     { "ENTER",        KEY_ENTER,            KEYCODE_ENTER },
  80.     { ";",          KEY_COLON,          KEYCODE_COLON },
  81.     { ":",          KEY_QUOTE,          KEYCODE_QUOTE },
  82.     { "\\",         KEY_BACKSLASH,      KEYCODE_BACKSLASH },
  83.     { "<",          KEY_BACKSLASH2,     KEYCODE_BACKSLASH2 },
  84.     { ",",          KEY_COMMA,          KEYCODE_COMMA },
  85.     { ".",          KEY_STOP,           KEYCODE_STOP },
  86.     { "/",          KEY_SLASH,          KEYCODE_SLASH },
  87.     { "SPACE",        KEY_SPACE,            KEYCODE_SPACE },
  88.     { "INS",        KEY_INSERT,            KEYCODE_INSERT },
  89.     { "DEL",        KEY_DEL,            KEYCODE_DEL },
  90.     { "HOME",        KEY_HOME,            KEYCODE_HOME },
  91.     { "END",        KEY_END,            KEYCODE_END },
  92.     { "PGUP",        KEY_PGUP,            KEYCODE_PGUP },
  93.     { "PGDN",        KEY_PGDN,            KEYCODE_PGDN },
  94.     { "LEFT",        KEY_LEFT,            KEYCODE_LEFT },
  95.     { "RIGHT",        KEY_RIGHT,            KEYCODE_RIGHT },
  96.     { "UP",            KEY_UP,                KEYCODE_UP },
  97.     { "DOWN",        KEY_DOWN,            KEYCODE_DOWN },
  98.     { "/ PAD",      KEY_SLASH_PAD,      KEYCODE_SLASH_PAD },
  99.     { "* PAD",      KEY_ASTERISK,       KEYCODE_ASTERISK },
  100.     { "- PAD",      KEY_MINUS_PAD,      KEYCODE_MINUS_PAD },
  101.     { "+ PAD",      KEY_PLUS_PAD,       KEYCODE_PLUS_PAD },
  102.     { ". PAD",      KEY_DEL_PAD,        KEYCODE_DEL_PAD },
  103.     { "ENTER PAD",  KEY_ENTER_PAD,      KEYCODE_ENTER_PAD },
  104.     { "PRTSCR",     KEY_PRTSCR,         KEYCODE_PRTSCR },
  105.     { "PAUSE",      KEY_PAUSE,          KEYCODE_PAUSE },
  106.     { "LSHIFT",        KEY_LSHIFT,            KEYCODE_LSHIFT },
  107.     { "RSHIFT",        KEY_RSHIFT,            KEYCODE_RSHIFT },
  108.     { "LCTRL",        KEY_LCONTROL,        KEYCODE_LCONTROL },
  109.     { "RCTRL",        KEY_RCONTROL,        KEYCODE_RCONTROL },
  110.     { "ALT",        KEY_ALT,            KEYCODE_LALT },
  111.     { "ALTGR",        KEY_ALTGR,            KEYCODE_RALT },
  112.     { "LWIN",        KEY_LWIN,            KEYCODE_OTHER },
  113.     { "RWIN",        KEY_RWIN,            KEYCODE_OTHER },
  114.     { "MENU",        KEY_MENU,            KEYCODE_OTHER },
  115.     { "SCRLOCK",    KEY_SCRLOCK,        KEYCODE_SCRLOCK },
  116.     { "NUMLOCK",    KEY_NUMLOCK,        KEYCODE_NUMLOCK },
  117.     { "CAPSLOCK",   KEY_CAPSLOCK,       KEYCODE_CAPSLOCK },
  118.     { 0, 0, 0 }    /* end of table */
  119. };
  120.  
  121.  
  122. /* return a list of all available keys */
  123. const struct KeyboardInfo *osd_get_key_list(void)
  124. {
  125.     return keylist;
  126. }
  127.  
  128.  
  129. int osd_is_key_pressed(int keycode)
  130. {
  131.     if (keycode >= KEY_MAX) return 0;
  132.  
  133.     if (keycode == KEY_PAUSE)
  134.     {
  135.         static int pressed,counter;
  136.         int res;
  137.  
  138.         res = key[KEY_PAUSE] ^ pressed;
  139.         if (res)
  140.         {
  141.             if (counter > 0)
  142.             {
  143.                 if (--counter == 0)
  144.                     pressed = key[KEY_PAUSE];
  145.             }
  146.             else counter = 10;
  147.         }
  148.  
  149.         return res;
  150.     }
  151.  
  152.     return key[keycode];
  153. }
  154.  
  155.  
  156. int osd_wait_keypress(void)
  157. {
  158.     clear_keybuf();
  159.     return readkey() >> 8;
  160. }
  161.  
  162.  
  163. int osd_readkey_unicode(int flush)
  164. {
  165.     if (flush) clear_keybuf();
  166.     if (keypressed())
  167.         return ureadkey(NULL);
  168.     else
  169.         return 0;
  170. }
  171.  
  172.  
  173. /*
  174.   limits:
  175.   - 7 joysticks
  176.   - 15 sticks on each joystick
  177.   - 63 buttons on each joystick
  178.  
  179.   - 256 total inputs
  180. */
  181. #define JOYCODE(joy,stick,axis_or_button,dir) \
  182.         ((((dir)&0x03)<<14)|(((axis_or_button)&0x3f)<<8)|(((stick)&0x1f)<<3)|(((joy)&0x07)<<0))
  183.  
  184. #define GET_JOYCODE_JOY(code) (((code)>>0)&0x07)
  185. #define GET_JOYCODE_STICK(code) (((code)>>3)&0x1f)
  186. #define GET_JOYCODE_AXIS(code) (((code)>>8)&0x3f)
  187. #define GET_JOYCODE_BUTTON(code) GET_JOYCODE_AXIS(code)
  188. #define GET_JOYCODE_DIR(code) (((code)>>14)&0x03)
  189.  
  190. /* use otherwise unused joystick codes for the three mouse buttons */
  191. #define MOUSE_BUTTON(button) JOYCODE(1,0,button,1)
  192.  
  193.  
  194. #define MAX_JOY 256
  195. #define MAX_JOY_NAME_LEN 40
  196.  
  197. static struct JoystickInfo joylist[MAX_JOY] =
  198. {
  199.     /* will be filled later */
  200.     { 0, 0, 0 }    /* end of table */
  201. };
  202.  
  203. static char joynames[MAX_JOY][MAX_JOY_NAME_LEN+1];    /* will be used to store names for the above */
  204.  
  205.  
  206. static int joyequiv[][2] =
  207. {
  208.     { JOYCODE(1,1,1,1),    JOYCODE_1_LEFT },
  209.     { JOYCODE(1,1,1,2),    JOYCODE_1_RIGHT },
  210.     { JOYCODE(1,1,2,1),    JOYCODE_1_UP },
  211.     { JOYCODE(1,1,2,2),    JOYCODE_1_DOWN },
  212.     { JOYCODE(1,0,1,0),    JOYCODE_1_BUTTON1 },
  213.     { JOYCODE(1,0,2,0),    JOYCODE_1_BUTTON2 },
  214.     { JOYCODE(1,0,3,0),    JOYCODE_1_BUTTON3 },
  215.     { JOYCODE(1,0,4,0),    JOYCODE_1_BUTTON4 },
  216.     { JOYCODE(1,0,5,0),    JOYCODE_1_BUTTON5 },
  217.     { JOYCODE(1,0,6,0),    JOYCODE_1_BUTTON6 },
  218.     { JOYCODE(2,1,1,1),    JOYCODE_2_LEFT },
  219.     { JOYCODE(2,1,1,2),    JOYCODE_2_RIGHT },
  220.     { JOYCODE(2,1,2,1),    JOYCODE_2_UP },
  221.     { JOYCODE(2,1,2,2),    JOYCODE_2_DOWN },
  222.     { JOYCODE(2,0,1,0),    JOYCODE_2_BUTTON1 },
  223.     { JOYCODE(2,0,2,0),    JOYCODE_2_BUTTON2 },
  224.     { JOYCODE(2,0,3,0),    JOYCODE_2_BUTTON3 },
  225.     { JOYCODE(2,0,4,0),    JOYCODE_2_BUTTON4 },
  226.     { JOYCODE(2,0,5,0),    JOYCODE_2_BUTTON5 },
  227.     { JOYCODE(2,0,6,0),    JOYCODE_2_BUTTON6 },
  228.     { JOYCODE(3,1,1,1),    JOYCODE_3_LEFT },
  229.     { JOYCODE(3,1,1,2),    JOYCODE_3_RIGHT },
  230.     { JOYCODE(3,1,2,1),    JOYCODE_3_UP },
  231.     { JOYCODE(3,1,2,2),    JOYCODE_3_DOWN },
  232.     { JOYCODE(3,0,1,0),    JOYCODE_3_BUTTON1 },
  233.     { JOYCODE(3,0,2,0),    JOYCODE_3_BUTTON2 },
  234.     { JOYCODE(3,0,3,0),    JOYCODE_3_BUTTON3 },
  235.     { JOYCODE(3,0,4,0),    JOYCODE_3_BUTTON4 },
  236.     { JOYCODE(3,0,5,0),    JOYCODE_3_BUTTON5 },
  237.     { JOYCODE(3,0,6,0),    JOYCODE_3_BUTTON6 },
  238.     { JOYCODE(4,1,1,1),    JOYCODE_4_LEFT },
  239.     { JOYCODE(4,1,1,2),    JOYCODE_4_RIGHT },
  240.     { JOYCODE(4,1,2,1),    JOYCODE_4_UP },
  241.     { JOYCODE(4,1,2,2),    JOYCODE_4_DOWN },
  242.     { JOYCODE(4,0,1,0),    JOYCODE_4_BUTTON1 },
  243.     { JOYCODE(4,0,2,0),    JOYCODE_4_BUTTON2 },
  244.     { JOYCODE(4,0,3,0),    JOYCODE_4_BUTTON3 },
  245.     { JOYCODE(4,0,4,0),    JOYCODE_4_BUTTON4 },
  246.     { JOYCODE(4,0,5,0),    JOYCODE_4_BUTTON5 },
  247.     { JOYCODE(4,0,6,0),    JOYCODE_4_BUTTON6 },
  248.     { 0,0 }
  249. };
  250.  
  251.  
  252. static void init_joy_list(void)
  253. {
  254.     int tot,i,j,k;
  255.     char buf[256];
  256.  
  257.     tot = 0;
  258.  
  259.     /* first of all, map mouse buttons */
  260.     for (j = 0;j < 3;j++)
  261.     {
  262.         sprintf(buf,"MOUSE B%d",j+1);
  263.         strncpy(joynames[tot],buf,MAX_JOY_NAME_LEN);
  264.         joynames[tot][MAX_JOY_NAME_LEN] = 0;
  265.         joylist[tot].name = joynames[tot];
  266.         joylist[tot].code = MOUSE_BUTTON(j+1);
  267.         tot++;
  268.     }
  269.  
  270.     for (i = 0;i < num_joysticks;i++)
  271.     {
  272.         for (j = 0;j < joy[i].num_sticks;j++)
  273.         {
  274.             for (k = 0;k < joy[i].stick[j].num_axis;k++)
  275.             {
  276.                 sprintf(buf,"J%d %s %s -",i+1,joy[i].stick[j].name,joy[i].stick[j].axis[k].name);
  277.                 strncpy(joynames[tot],buf,MAX_JOY_NAME_LEN);
  278.                 joynames[tot][MAX_JOY_NAME_LEN] = 0;
  279.                 joylist[tot].name = joynames[tot];
  280.                 joylist[tot].code = JOYCODE(i+1,j+1,k+1,1);
  281.                 tot++;
  282.  
  283.                 sprintf(buf,"J%d %s %s +",i+1,joy[i].stick[j].name,joy[i].stick[j].axis[k].name);
  284.                 strncpy(joynames[tot],buf,MAX_JOY_NAME_LEN);
  285.                 joynames[tot][MAX_JOY_NAME_LEN] = 0;
  286.                 joylist[tot].name = joynames[tot];
  287.                 joylist[tot].code = JOYCODE(i+1,j+1,k+1,2);
  288.                 tot++;
  289.             }
  290.         }
  291.         for (j = 0;j < joy[i].num_buttons;j++)
  292.         {
  293.             sprintf(buf,"J%d %s",i+1,joy[i].button[j].name);
  294.             strncpy(joynames[tot],buf,MAX_JOY_NAME_LEN);
  295.             joynames[tot][MAX_JOY_NAME_LEN] = 0;
  296.             joylist[tot].name = joynames[tot];
  297.             joylist[tot].code = JOYCODE(i+1,0,j+1,0);
  298.             tot++;
  299.         }
  300.     }
  301.  
  302.     /* terminate array */
  303.     joylist[tot].name = 0;
  304.     joylist[tot].code = 0;
  305.     joylist[tot].standardcode = 0;
  306.  
  307.     /* fill in equivalences */
  308.     for (i = 0;i < tot;i++)
  309.     {
  310.         joylist[i].standardcode = JOYCODE_OTHER;
  311.  
  312.         j = 0;
  313.         while (joyequiv[j][0] != 0)
  314.         {
  315.             if (joyequiv[j][0] == joylist[i].code)
  316.             {
  317.                 joylist[i].standardcode = joyequiv[j][1];
  318.                 break;
  319.             }
  320.             j++;
  321.         }
  322.     }
  323. }
  324.  
  325.  
  326. /* return a list of all available joys */
  327. const struct JoystickInfo *osd_get_joy_list(void)
  328. {
  329.     return joylist;
  330. }
  331.  
  332.  
  333. int osd_is_joy_pressed(int joycode)
  334. {
  335.     int joy_num,stick;
  336.  
  337.  
  338.     /* special case for mouse buttons */
  339.     switch (joycode)
  340.     {
  341.         case MOUSE_BUTTON(1):
  342.             return mouse_b & 1; break;
  343.         case MOUSE_BUTTON(2):
  344.             return mouse_b & 2; break;
  345.         case MOUSE_BUTTON(3):
  346.             return mouse_b & 4; break;
  347.     }
  348.  
  349.     joy_num = GET_JOYCODE_JOY(joycode);
  350.  
  351.     /* do we have as many sticks? */
  352.     if (joy_num == 0 || joy_num > num_joysticks)
  353.         return 0;
  354.     joy_num--;
  355.  
  356.     stick = GET_JOYCODE_STICK(joycode);
  357.  
  358.     if (stick == 0)
  359.     {
  360.         /* buttons */
  361.         int button;
  362.  
  363.         button = GET_JOYCODE_BUTTON(joycode);
  364.         if (button == 0 || button > joy[joy_num].num_buttons)
  365.             return 0;
  366.         button--;
  367.  
  368.         return joy[joy_num].button[button].b;
  369.     }
  370.     else
  371.     {
  372.         /* sticks */
  373.         int axis,dir;
  374.  
  375.         if (stick > joy[joy_num].num_sticks)
  376.             return 0;
  377.         stick--;
  378.  
  379.         axis = GET_JOYCODE_AXIS(joycode);
  380.         dir = GET_JOYCODE_DIR(joycode);
  381.  
  382.         if (axis == 0 || axis > joy[joy_num].stick[stick].num_axis)
  383.             return 0;
  384.         axis--;
  385.  
  386.         switch (dir)
  387.         {
  388.             case 1:
  389.                 return joy[joy_num].stick[stick].axis[axis].d1; break;
  390.             case 2:
  391.                 return joy[joy_num].stick[stick].axis[axis].d2; break;
  392.             default:
  393.                 return 0; break;
  394.         }
  395.     }
  396.  
  397.     return 0;
  398. }
  399.  
  400.  
  401. void osd_poll_joysticks(void)
  402. {
  403.     if (joystick > JOY_TYPE_NONE)
  404.         poll_joystick();
  405. }
  406.  
  407.  
  408. /* return a value in the range -128 .. 128 (yes, 128, not 127) */
  409. void osd_analogjoy_read(int player,int *analog_x, int *analog_y)
  410. {
  411.     *analog_x = *analog_y = 0;
  412.  
  413.     /* is there an analog joystick at all? */
  414.     if (player+1 > num_joysticks || joystick == JOY_TYPE_NONE)
  415.         return;
  416.  
  417.     *analog_x = joy[player].stick[0].axis[0].pos;
  418.     *analog_y = joy[player].stick[0].axis[1].pos;
  419. }
  420.  
  421.  
  422. static int calibration_target;
  423.  
  424. int osd_joystick_needs_calibration (void)
  425. {
  426.     /* This could be improved, but unfortunately, this version of Allegro */
  427.     /* lacks a flag which tells if a joystick is calibrationable, it only  */
  428.     /* remembers whether calibration is yet to be done. */
  429.     if (joystick == JOY_TYPE_NONE)
  430.         return 0;
  431.     else
  432.         return 1;
  433. }
  434.  
  435.  
  436. void osd_joystick_start_calibration (void)
  437. {
  438.     /* reinitialises the joystick. */
  439.     remove_joystick();
  440.     install_joystick (joystick);
  441.     calibration_target = 0;
  442. }
  443.  
  444. char *osd_joystick_calibrate_next (void)
  445. {
  446.     while (calibration_target < num_joysticks)
  447.     {
  448.         if (joy[calibration_target].flags & JOYFLAG_CALIBRATE)
  449.             return (calibrate_joystick_name (calibration_target));
  450.         else
  451.             calibration_target++;
  452.     }
  453.  
  454.     return 0;
  455. }
  456.  
  457. void osd_joystick_calibrate (void)
  458. {
  459.     calibrate_joystick (calibration_target);
  460. }
  461.  
  462. void osd_joystick_end_calibration (void)
  463. {
  464.     save_joystick_data(0);
  465. }
  466.  
  467. #include <time.h>
  468.  
  469. void osd_trak_read(int player,int *deltax,int *deltay)
  470. {
  471.     if (player != 0 || use_mouse == 0) *deltax = *deltay = 0;
  472.     else
  473.     {
  474.         static int skip;
  475.         static int mx,my;
  476.  
  477.         /* get_mouse_mickeys() doesn't work when called 60 times per second,
  478.            it often returns 0, so I have to call it every other frame and split
  479.            the result between two frames.
  480.           */
  481.         if (skip)
  482.         {
  483.             *deltax = mx;
  484.             *deltay = my;
  485.         }
  486.         else
  487.         {
  488.             get_mouse_mickeys(&mx,&my);
  489.             *deltax = mx/2;
  490.             *deltay = my/2;
  491.             mx -= *deltax;
  492.             my -= *deltay;
  493.         }
  494.         skip ^= 1;
  495.     }
  496. }
  497.  
  498.  
  499. #ifndef NEOFREE
  500. #ifndef TINY_COMPILE
  501. extern int no_of_tiles;
  502. extern struct GameDriver driver_neogeo;
  503. #endif
  504. #endif
  505.  
  506. void osd_customize_inputport_defaults(struct ipd *defaults)
  507. {
  508.     if (use_hotrod)
  509.     {
  510.         while (defaults->type != IPT_END)
  511.         {
  512.             int j;
  513.             for(j=0;j<SEQ_MAX;++j)
  514.             {
  515.                 if (defaults->seq[j] == KEYCODE_UP) defaults->seq[j] = KEYCODE_8_PAD;
  516.                 if (defaults->seq[j] == KEYCODE_DOWN) defaults->seq[j] = KEYCODE_2_PAD;
  517.                 if (defaults->seq[j] == KEYCODE_LEFT) defaults->seq[j] = KEYCODE_4_PAD;
  518.                 if (defaults->seq[j] == KEYCODE_RIGHT) defaults->seq[j] = KEYCODE_6_PAD;
  519.             }
  520.             if (defaults->type == IPT_UI_SELECT) seq_set_1(&defaults->seq, KEYCODE_LCONTROL);
  521.             if (defaults->type == IPT_START1) seq_set_1(&defaults->seq, KEYCODE_1);
  522.             if (defaults->type == IPT_START2) seq_set_1(&defaults->seq, KEYCODE_2);
  523.             if (defaults->type == IPT_COIN1)  seq_set_1(&defaults->seq, KEYCODE_3);
  524.             if (defaults->type == IPT_COIN2)  seq_set_1(&defaults->seq, KEYCODE_4);
  525.             if (defaults->type == (IPT_JOYSTICKRIGHT_UP    | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_R);
  526.             if (defaults->type == (IPT_JOYSTICKRIGHT_DOWN  | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_F);
  527.             if (defaults->type == (IPT_JOYSTICKRIGHT_LEFT  | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_D);
  528.             if (defaults->type == (IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_G);
  529.             if (defaults->type == (IPT_JOYSTICKLEFT_UP     | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_8_PAD);
  530.             if (defaults->type == (IPT_JOYSTICKLEFT_DOWN   | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_2_PAD);
  531.             if (defaults->type == (IPT_JOYSTICKLEFT_LEFT   | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_4_PAD);
  532.             if (defaults->type == (IPT_JOYSTICKLEFT_RIGHT  | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_6_PAD);
  533.             if (defaults->type == (IPT_BUTTON1 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_LCONTROL);
  534.             if (defaults->type == (IPT_BUTTON2 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_LALT);
  535.             if (defaults->type == (IPT_BUTTON3 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_SPACE);
  536.             if (defaults->type == (IPT_BUTTON4 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_LSHIFT);
  537.             if (defaults->type == (IPT_BUTTON5 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_Z);
  538.             if (defaults->type == (IPT_BUTTON6 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_X);
  539.             if (defaults->type == (IPT_BUTTON1 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_A);
  540.             if (defaults->type == (IPT_BUTTON2 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_S);
  541.             if (defaults->type == (IPT_BUTTON3 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_Q);
  542.             if (defaults->type == (IPT_BUTTON4 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_W);
  543.             if (defaults->type == (IPT_BUTTON5 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_E);
  544.             if (defaults->type == (IPT_BUTTON6 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_OPENBRACE);
  545.  
  546. #ifndef NEOFREE
  547. #ifndef TINY_COMPILE
  548.             if (use_hotrod == 2 &&
  549.                     (Machine->gamedrv->clone_of == &driver_neogeo ||
  550.                     (Machine->gamedrv->clone_of && Machine->gamedrv->clone_of->clone_of == &driver_neogeo)))
  551.             {
  552.                 if (defaults->type == (IPT_BUTTON1 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_C);
  553.                 if (defaults->type == (IPT_BUTTON2 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_LSHIFT);
  554.                 if (defaults->type == (IPT_BUTTON3 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_Z);
  555.                 if (defaults->type == (IPT_BUTTON4 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_X);
  556.                 if (defaults->type == (IPT_BUTTON5 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  557.                 if (defaults->type == (IPT_BUTTON6 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  558.                 if (defaults->type == (IPT_BUTTON7 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  559.                 if (defaults->type == (IPT_BUTTON8 | IPF_PLAYER1)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  560.                 if (defaults->type == (IPT_BUTTON1 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_CLOSEBRACE);
  561.                 if (defaults->type == (IPT_BUTTON2 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_W);
  562.                 if (defaults->type == (IPT_BUTTON3 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_E);
  563.                 if (defaults->type == (IPT_BUTTON4 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_OPENBRACE);
  564.                 if (defaults->type == (IPT_BUTTON5 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  565.                 if (defaults->type == (IPT_BUTTON6 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  566.                 if (defaults->type == (IPT_BUTTON7 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  567.                 if (defaults->type == (IPT_BUTTON8 | IPF_PLAYER2)) seq_set_1(&defaults->seq,KEYCODE_NONE);
  568.             }
  569. #endif
  570. #endif
  571.  
  572.             defaults++;
  573.         }
  574.     }
  575. }
  576.  
  577.  
  578.  
  579. static int leds=0;
  580. static const int led_flags[3] = {
  581.   KB_NUMLOCK_FLAG,
  582.   KB_CAPSLOCK_FLAG,
  583.   KB_SCROLOCK_FLAG
  584. };
  585. void osd_led_w(int led,int on) {
  586.   int temp=leds;
  587.   if (led<3) {
  588.     if (on&1)
  589.     temp |=  led_flags[led];
  590.     else
  591.     temp &= ~led_flags[led];
  592.     if (temp!=leds) {
  593.     leds=temp;
  594.     set_leds (leds);
  595.     }
  596.   }
  597. }
  598.  
  599.  
  600.  
  601.  
  602.  
  603. void msdos_init_input (void)
  604. {
  605.     int err;
  606.  
  607.     install_keyboard();
  608. /* ALLEGRO BUG: the following hangs on many machines */
  609. //    set_leds(0);    /* turn off all leds */
  610.  
  611.     if (joystick != JOY_TYPE_NONE)
  612.     {
  613.         /* Try to install Allegro's joystick handler */
  614.  
  615.         /* load calibration data (from mame.cfg) */
  616.         /* if valid data was found, this also sets Allegro's joy_type */
  617.         err=load_joystick_data(0);
  618.  
  619.         /* valid calibration? */
  620.         if (err)
  621.         {
  622.             logerror("No calibration data found\n");
  623.             if (install_joystick (joystick) != 0)
  624.             {
  625.                 printf ("Joystick not found.\n");
  626.                 joystick = JOY_TYPE_NONE;
  627.             }
  628.         }
  629.         else if (joystick != joy_type)
  630.         {
  631.             logerror("Calibration data is from different joystick\n");
  632.             remove_joystick();
  633.             if (install_joystick (joystick) != 0)
  634.             {
  635.                 printf ("Joystick not found.\n");
  636.                 joystick = JOY_TYPE_NONE;
  637.             }
  638.         }
  639.  
  640.         if (joystick == JOY_TYPE_NONE)
  641.             logerror("Joystick not found\n");
  642.         else
  643.             logerror("Installed %s %s\n",
  644.                     joystick_driver->name, joystick_driver->desc);
  645.     }
  646.  
  647.     init_joy_list();
  648.  
  649.     if (use_mouse && install_mouse() != -1)
  650.         use_mouse = 1;
  651.     else
  652.         use_mouse = 0;
  653. }
  654.  
  655.  
  656. void msdos_shutdown_input(void)
  657. {
  658.     remove_keyboard();
  659. }
  660.